package cz.vse.po1715.lode.net.klient;

import cz.vse.po1715.lode.net.obecne.SpravcePrikazu;
import cz.vse.po1715.lode.net.obecne.HerniUdalost;
import cz.vse.po1715.lode.net.obecne.IHerniUdalost;

/*******************************************************************************
 * Instance třídy {@code Klient} představují potomky třídy {@code AKlient} tj. 
 * síťové klienty pomocí nichž daný hráč posílá své herní události jiným hráčům
 * na server a přijímá ze serveru herní události ostatních hráčů
 * @author    Dominik KOSTKA
 * @version   0.00.000
 */
public class Klient extends AKlient
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** odkaz na konzolový načítač událostí, který načítá události z uživatelského
     vstupu*/
    protected SpravcePrikazu načítačKonzole;
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    public Klient()
    {
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /**
     * return jméno hry ke které klient patří
     */
    @Override
    public String getNázevHry() {
        return "Lode";
    }

    /**
     * tovární metoda pro vytvoření herní události
     */
    @Override
    public IHerniUdalost vytvořHerníUdálost() {
        return new HerniUdalost();
    }

    /**
     * tovární metoda pro vytvoření připojovací události
     */
    @Override
    public IHerniUdalost vytvořPřipojovacíUdálost() {
        return new HerniUdalost(HerniUdalost.K_PŘIPOJENÍ);
    }

    /**
     * tovární metoda pro vytvoření odpojovací události
     */
    @Override
    public IHerniUdalost vytvořOdpojovacíUdálost(String důvod) {
        return new HerniUdalost(HerniUdalost.S_ODPOJENÍ, důvod);
    }

    @Override
    protected void zpracujPříchozíUdálost() {
        IHerniUdalost událost;
	while (příchozíFronta.getPocet() > 0) {
	    try {
		událost = příchozíFronta.vyjmi();

		switch (událost.getTyp()) {
		case HerniUdalost.S_PŘIPOJENÍ_ACK_OK:
		    break;
		case HerniUdalost.SH_PŘIPOJENÍ:
		    stdVystup( "připojení: " + událost.getZprava());
		    break;
		case HerniUdalost.SH_ODPOJENÍ:
		    stdVystup( "odpojení: " + událost.getZprava());
		    break;
		case HerniUdalost.SH_CHAT_ZPRÁVA:
		    stdVystup( událost.getIdHrac() + ": " + událost.getZprava());
		    break;
		case HerniUdalost.S_ODPOJENÍ:
		    stdChybovýVýstup( událost.getZprava());
		    vypni();
		    break;
		case HerniUdalost.S_PŘIHLÁŠENÍ_HRA_ACK_OK:
		    stdVystup( událost.getZprava());
		    veHře = true;
		    break;
		case HerniUdalost.S_PŘIHLÁŠENÍ_HRA_ACK_FAIL:
		    stdVystup( událost.getZprava());
		    veHře = false;
		    break;
		case HerniUdalost.SH_HRÁČ_ODHLÁŠEN:
		    stdVystup( událost.getZprava());
		    veHře = false;
		    break;
		default:
		    stdVystup( událost.getZprava());
		    break;
		}
	    }
	    catch (InterruptedException ie) {}
	}
    }

//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /**
     * zavolá metodu AKlient.inicializuj() a inicializuje a zapne
     * konzolový načítač událostí, která načítá vstup klienta z konzole
     */
    @Override
    public void inicializuj(String args[]) {
	super.inicializuj(args);
	načítačKonzole = new SpravcePrikazu
                (this, příchozíFronta, odchozíFronta);
	načítačKonzole.start();
    }

    /**
     * vypne klienta
     */
    @Override
    protected void vypni() {
	načítačKonzole.vypni();
	super.vypni();
    }
    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Klient inst = new Klient();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {
        if (args.length < 2) {
	    System.out.println
            ("Pro spuštění a připojení klienta k požadovanému serveru zadejte:\n" +
             "java cz.vse.po1715.lode.net.klient.Klient " +
             "<host> <player_name>\n");
	    System.exit(0);
	}

	// spuštění klienta
	Klient klient = new Klient();
	klient.inicializuj(args);
	klient.start();
    }
}
